{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Robodyno MiMotor API"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 1.电机状态设置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入robodyno库，创建CAN总线对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from robodyno.components.can_bus.mi_motor import MiMotor\n",
    "from robodyno.interfaces import CanBus\n",
    "can = CanBus()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 搜索总线上所有的小米电机"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for id in range(0x01, 0x80):\n",
    "    data = MiMotor.get_mcu_uuid(can, id , 0.01)\n",
    "    if data is not None:\n",
    "        print(f\"Found motor with id: {id}, mcu_uuid: {data}\")\n",
    "        break\n",
    "print(\"Done\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初始化小米电机对象"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`MiMotor(can, id_=0x7F)`\n",
    "\n",
    "参数：\n",
    "- `can` : can总线接口\n",
    "- `id_` : 电机ID,默认0x7F（ 范围从 0x01 到 0x7F ）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor = MiMotor(can, 0x7F)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 电机使能"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`enable()`\n",
    "\n",
    "- 使能后，可以控制电机。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.enable()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 电机失能"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`disable()`\n",
    "\n",
    "- 这是上电后的默认状态。\n",
    "- 失能后，电机停止工作，转矩松动。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.disable()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初始化当前位置"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`init_pos()`\n",
    "\n",
    "- 将电机的当前位置设置为初始位置。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.init_pos()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 电机校准"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`calibrate()`\n",
    "\n",
    "- 在失能状态下运行。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.calibrate()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置电机CAN_ID"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`config_can_bus(new_id)`\n",
    "\n",
    "参数 ：\n",
    "\n",
    "- `new_id` ：电机新CAN_ID (0x01~0x7F), 与标准robodyno库中的id不冲突"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.config_can_bus(new_id = 0x7F)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存设置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`save()`\n",
    "- 保存电机参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "motor.save()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 清除错误"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`clear_errors()`\n",
    "\n",
    "- 如果解决了原因，大多数错误都会自动清除。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.clear_errors()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 电机软急停"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`estop()`\n",
    "\n",
    "- 暂不支持该接口，将抛出一个NotImplementedError异常。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.estop()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 电机重启"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`reboot()`\n",
    "\n",
    "- 暂不支持该接口，将抛出一个NotImplementedError异常。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.reboot()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 恢复出厂设置"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`reset()`\n",
    "\n",
    "- 此命令将电机重置为出厂设置。所有配置将丢失，id将重置为`0x7F`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.reset()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 2.电机模式设置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 进入MIT模式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`mit_mode()`\n",
    "\n",
    "- 使用MIT模式控制电机的位速力"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "motor.mit_mode()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 进入直接位置模式"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`position_mode()`\n",
    "\n",
    "- 直接使用PID控制位置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "motor.position_mode()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 进入直接速度模式"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`velocity_mode()`\n",
    "\n",
    "- 直接使用PID控制速度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.velocity_mode()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 进入力矩控制模式"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`torque_mode()`\n",
    "\n",
    "- 设置电机为力矩控制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.torque_mode()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "## 3.电机参数设置"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置MIT模式"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_mit(torque, position, velocity, kp, kd)`\n",
    "\n",
    "参数:\n",
    "- `torque`: 力矩\n",
    "- `position`: 位置\n",
    "- `velocity`: 速度\n",
    "- `kp`: 位置系数\n",
    "- `kd`: 速度系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "torque = 0\n",
    "position = 1\n",
    "velocity = 0\n",
    "kp = 1\n",
    "kd = 0\n",
    "motor.set_mit(torque, position, velocity, kp, kd)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置位置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_pos(pos)`\n",
    "\n",
    "参数:\n",
    "\n",
    "- `pos`: 目标位置(rad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "motor.set_pos(-21.57)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置速度"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_vel(vel)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `vel`: 目标速度(rad/s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.set_vel(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置力矩, 电流再考虑\n",
    "todo: 确定这里的是力矩还是电流"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_torque(torque)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `torque`: 目标力矩(Nm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.set_torque(-0.12)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置电机PID参数\n",
    "\n",
    "todo: pid 代码修改"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_pid(pos_kp, vel_kp, vel_ki)`\n",
    "\n",
    "参数:\n",
    "\n",
    "- `pos_kp`: 位置环比例系数\n",
    "- `vel_kp`: 速度环比例系数\n",
    "- `vel_ki`: 速度环积分系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.set_pid(2, 0.021, 30)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置电机速度限制\n",
    "在位置模式中生效"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_vel_limit(vel_lim)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `vel_lim`: 输出端最大速度(rad/s), 必须为正值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.set_vel_limit(3.14)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置电机电流限制\n",
    "在速度模式中生效"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`set_current_limit(current_lim)`\n",
    "\n",
    "参数:\n",
    "\n",
    "- `current_lim` : 最大电流(A), 必须为正值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.set_current_limit(10)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true,
    "tags": []
   },
   "source": [
    "## 4.读取电机参数"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机详细状态"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_state(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值 ：\n",
    "\n",
    "- 电机状态(MotorState)\n",
    "    - 0-空闲，1-校准，2-使能\n",
    "- 电机错误(error)\n",
    "    - `error` : 错误码（1-电压不足，2-电流过大，4-温度过高，8-磁编码错误，16-霍尔编码错误，32-未校准）\n",
    "    - `motor_err` : 直接返回0\n",
    "    - `encoder_err` : 直接返回0\n",
    "    - `controller_err` : 直接返回0\n",
    "- 电机控制模式(MotorControlMode)\n",
    "    - MIT模式 : 0\n",
    "    - 位置模式 : 1\n",
    "    - 速度模式 : 2\n",
    "    - 力矩模式 : 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_state()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取总线电压"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_voltage(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值 ：\n",
    "\n",
    "- 总线电压值 ( V ) ，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_voltage(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机温度"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_temperature(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 电机温度 ( °C ) ，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_temperature(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机控制模式"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_mode(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "返回值：\n",
    "\n",
    " - 控制模式(int)\n",
    "    - 0 mit\n",
    "    - 1 位置\n",
    "    - 2 速度\n",
    "    - 3 力矩"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_mode()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机参数反馈"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_feedback(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值 ：\n",
    "\n",
    "- 电机参数(位置rad, 速度rad/s, 力矩Nm)，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_feedback(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机位置"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_pos(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 位置(rad)，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_pos(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机速度"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_vel(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 速度(rad/s)，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_vel(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机力矩"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_torque(timeout = 0.1)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，None代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 力矩(Nm)，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_torque(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机PID参数\n",
    "\n",
    "todo: 读取pid 程序 修改"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_pid(timeout = 0)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，0代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 电机PID\n",
    "    - `pos_kp` : 位置环P\n",
    "    - `vel_kp` : 速度环P\n",
    "    - `vel_ki` : 速度环I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_pid(1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机速度限制"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_vel_limit(timeout = 0)`\n",
    "\n",
    "参数:\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，0代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 输出端最大速度(rad/s)，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_vel_limit()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机电流限制"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_current_limit(timeout = 0)`\n",
    "\n",
    "参数:\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，0代表无超时时间\n",
    "\n",
    "返回值：\n",
    "\n",
    "- 最大电流(A)，超时则不返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_current_limit()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取电机版本"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`get_version(timeout = 0)`\n",
    "\n",
    "参数：\n",
    "\n",
    "- `timeout` : 请求超时时间(s)，0代表无超时时间\n",
    "\n",
    "返回值 ：\n",
    "\n",
    "- API版本dict\n",
    "    - `main_version` : 主版本号\n",
    "    - `sub_version` : 副版本号\n",
    "    - `data` : 电机减速比\n",
    "    - `type` : 设备类型\n",
    "      - CYBER GEAR"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "motor.get_version(1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
